//
// CipherFactory.h
//
// Library: Crypto
// Package: Cipher
// Module:  CipherFactory
//
// Definition of the CipherFactory class.
//
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
// and Contributors.
//
// SPDX-License-Identifier:	BSL-1.0
//


#ifndef Crypto_CipherFactory_INCLUDED
#define Crypto_CipherFactory_INCLUDED


#include "Poco/Crypto/Crypto.h"


namespace Poco
{
namespace Crypto
{


    class Cipher;
    class CipherKey;
    class RSAKey;


    class Crypto_API CipherFactory
    /// A factory for Cipher objects. See the Cipher class for examples on how to
    /// use the CipherFactory.
    {
    public:
        CipherFactory();
        /// Creates a new CipherFactory object.

        virtual ~CipherFactory();
        /// Destroys the CipherFactory.

        Cipher * createCipher(const CipherKey & key);
        /// Creates a Cipher object for the given Cipher name. Valid cipher
        /// names depend on the OpenSSL version the library is linked with;
        /// see the output of
        ///
        ///     openssl enc --help
        ///
        /// for a list of supported block and stream ciphers.
        ///
        /// Common examples are:
        ///
        ///   * AES: "aes-128", "aes-256"
        ///   * DES: "des", "des3"
        ///   * Blowfish: "bf"

        Cipher * createCipher(const RSAKey & key, RSAPaddingMode paddingMode = RSA_PADDING_PKCS1);
        /// Creates a RSACipher using the given RSA key and padding mode
        /// for public key encryption/private key decryption.

        static CipherFactory & defaultFactory();
        /// Returns the default CipherFactory.

    private:
        CipherFactory(const CipherFactory &);
        CipherFactory & operator=(const CipherFactory &);
    };


}
} // namespace Poco::Crypto


#endif // Crypto_CipherFactory_INCLUDED
